package cn.hamster3.mc.plugin.core.bukkit.constant;

import cn.hamster3.mc.plugin.core.bukkit.api.CoreBukkitAPI;
import cn.hamster3.mc.plugin.core.bukkit.util.CoreBukkitUtils;
import cn.hamster3.mc.plugin.core.common.data.DisplayMessage;
import lombok.Getter;
import net.kyori.adventure.audience.Audience;
import net.kyori.adventure.text.TextReplacementConfig;
import org.bukkit.command.CommandSender;
import org.bukkit.configuration.ConfigurationSection;
import org.bukkit.configuration.file.YamlConfiguration;
import org.bukkit.plugin.Plugin;
import org.jetbrains.annotations.NotNull;

import java.io.File;
import java.io.IOException;

@Getter
public enum CoreMessage {
    COMMAND_NOT_FOUND("§c未找到该指令"),
    COMMAND_NOT_HAS_PERMISSION("§c你没有这个权限"),
    COMMAND_MUST_USED_BY_PLAYER("§c这个命令只能由玩家执行"),
    COMMAND_DEBUG_INFO_MODE_ON("§a信息查询模式: 已开启"),
    COMMAND_DEBUG_INFO_MODE_OFF("§a信息查询模式: 已关闭"),

    COMMAND_LORE_HAND_EMPTY("§c你必须手持一个物品才能使用这个命令"),

    COMMAND_LORE_ADD_WAIT_CHAT_TEXT("§a请于 15 秒内在聊天框输入想要添加的 lore 文本"),
    COMMAND_LORE_ADD_TIMEOUT("§a已取消添加 lore"),
    COMMAND_LORE_ADD_SUCCESS("§a已成功添加 lore 文本"),

    COMMAND_LORE_CLEAR_NOTHING("§c这个物品没有 lore 文本"),
    COMMAND_LORE_CLEAR_SUCCESS("§a已清理该物品的全部 lore 文本"),

    COMMAND_LORE_CMD_CLEAR_SUCCESS("§a已清理物品的自定义模型"),
    COMMAND_LORE_CMD_SET_INPUT_ERROR("§c设置物品的自定义模型失败: 模型 ID 必须是一个数字"),
    COMMAND_LORE_CMD_SET_SUCCESS("§a已设置物品的自定义模型为: %data%"),

    COMMAND_LORE_FLAG_NOT_INPUT("§c设置物品 flag 失败: 未输入任何文本"),
    COMMAND_LORE_FLAG_SET_ERROR_INPUT("§c设置物品 flag 失败: 输入的 flag 有误"),
    COMMAND_LORE_FLAG_REMOVE_SUCCESS("§a已移除物品的 flag: %flag%"),
    COMMAND_LORE_FLAG_SET_SUCCESS("§a已设置物品的 flag: %flag%"),

    COMMAND_LORE_NAME_WAIT_CHAT_TEXT("§a请于 15 秒内在聊天框输入想要设置的物品名称"),
    COMMAND_LORE_NAME_TIMEOUT("§c已取消设置物品名称"),
    COMMAND_LORE_NAME_SUCCESS("§a已成功设置物品名称"),

    COMMAND_LORE_REMOVE_INPUT_NUMBER_ERROR("§c行号必须是一个大于 0 的整数"),
    COMMAND_LORE_REMOVE_INDEX_OUT_OF_RANGE("§c你的手持物品没有这么多行 lore 文本"),

    COMMAND_LORE_REMOVE_NOTHING("§c这个物品没有 lore"),
    COMMAND_LORE_REMOVE_SUCCESS("§a已成功删除一行 lore 文本"),

    COMMAND_LORE_SET_NOT_INPUT_NUMBER("§c请输入要设置的行号"),
    COMMAND_LORE_SET_INPUT_NUMBER_ERROR("§c行号必须是一个大于 0 的整数"),
    COMMAND_LORE_SET_WAIT_CHAT_TEXT("§c请于 15 秒内在聊天框输入想要设置的 lore 文本"),
    COMMAND_LORE_SET_INDEX_OUT_OF_RANGE("§c你的手持物品没有这么多行 lore 文本"),
    COMMAND_LORE_SET_SUCCESS("§a已成功设置 lore 文本"),

    COMMAND_LORE_INSERT_NOT_INPUT_NUMBER("§c请输入要插入 lore 的行号"),
    COMMAND_LORE_INSERT_INPUT_NUMBER_ERROR("§c行号必须是一个大于等于 0 的整数"),
    COMMAND_LORE_INSERT_WAIT_CHAT_TEXT("§a请于 15 秒内在聊天框输入想要插入的 lore 文本"),
    COMMAND_LORE_INSERT_INDEX_OUT_OF_RANGE("§c你的手持物品没有这么多行 lore 文本"),
    COMMAND_LORE_INSERT_SUCCESS("§a已成功插入 lore 文本");

    @NotNull
    private DisplayMessage message;

    CoreMessage(@NotNull String message) {
        this.message = new DisplayMessage().setMessage(message);
    }

    @SuppressWarnings("CallToPrintStackTrace")
    public static void init(@NotNull Plugin plugin) {
        File dataFolder = plugin.getDataFolder();
        if (dataFolder.mkdirs()) {
            plugin.getLogger().info("已生成插件存档文件夹");
        }
        File file = new File(dataFolder, "messages.yml");
        YamlConfiguration config = new YamlConfiguration();
        if (file.exists()) {
            try {
                config.load(file);
            } catch (Exception e) {
                plugin.getLogger().warning("加载消息配置文件时出现了一个异常:");
                e.printStackTrace();
            }
        }
        for (CoreMessage value : values()) {
            ConfigurationSection section = config.getConfigurationSection(value.name());
            if (section == null) {
                plugin.getLogger().info("生成消息设置: " + value.name());
                config.set(value.name(), CoreBukkitUtils.saveDisplayMessage(value.message));
                continue;
            }
            try {
                value.message = CoreBukkitUtils.loadDisplayMessage(section);
            } catch (Exception e) {
                plugin.getLogger().warning("加载消息设置 " + value.name() + " 时遇到了一个异常: ");
                e.printStackTrace();
            }
        }
        try {
            config.save(file);
        } catch (IOException e) {
            plugin.getLogger().warning("保存消息配置文件时出现了一个异常:");
            e.printStackTrace();
        }
    }

    public void show(@NotNull CommandSender sender) {
        message.show(CoreBukkitAPI.getInstance().getAudienceProvider().sender(sender));
    }

    public void show(@NotNull CommandSender sender, @NotNull String... replacement) {
        if (replacement.length % 2 != 0) {
            throw new IllegalArgumentException();
        }
        TextReplacementConfig[] configs = new TextReplacementConfig[replacement.length / 2];
        for (int i = 0; i < configs.length; i++) {
            String key = replacement[i * 2];
            String value = replacement[i * 2 + 1];
            configs[i] = TextReplacementConfig.builder().matchLiteral(key).replacement(value).build();
        }
        Audience audience = CoreBukkitAPI.getInstance().getAudienceProvider().sender(sender);
        message.show(audience, configs);
    }
}
